#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
import numpy as np
from lxml.html import fromstring
import time
from random import random
from requests_html import HTMLSession


# In[2]:


from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities


# In[3]:


opts = webdriver.ChromeOptions()
opts.add_argument('--no-sandbox')
opts.add_argument('window-size=1920x3000') 
opts.add_argument('--disable-gpu') 
opts.add_argument('--hide-scrollbars') 

driver = webdriver.Chrome( chrome_options = opts) 


# In[4]:


driver.get("https://www.cnki.net/")
# 打开知网


# In[6]:


driver.find_element_by_id("Ecp_loginShowName1").get_attribute('innerHTML')


# In[7]:


element=driver.find_element_by_id('highSearch')
element.get_attribute('innerHTML')
element.click()


# In[8]:


driver.current_window_handle


# In[9]:


driver.window_handles


# In[10]:


driver.switch_to_window(driver.window_handles[1])


# In[11]:


element=driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/ul[1]/li[1]/a/span')
element.get_attribute('innerHTML')
element.click()


# In[12]:


element=driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/ul/li[4]')
element.click()


# In[13]:


element=driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/textarea')
element.clear()
element.send_keys(' SU=“大数据” AND SU=“人工智能”')


# In[14]:


element=driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input')
element.click()


# In[15]:


driver.find_element_by_xpath('//*[@id="countPageDiv"]/span[1]/em').get_attribute('innerHTML')


# In[16]:


element=driver.find_element_by_xpath('//*[@id="perPageDiv"]/div/i')
element.click()


# In[17]:


element=driver.find_element_by_xpath('//*[@id="perPageDiv"]/ul/li[3]/a')
element.click()


# In[18]:


import pandas as pd


# In[19]:


element=driver.find_element_by_id('gridTable')
页面_表格_html=element.get_attribute('innerHTML')
pd.read_html(页面_表格_html)[0]


# In[ ]:


# 批量下载


# In[47]:


import time


# In[52]:


driver.find_element_by_xpath('//*[@id="divGroup"]/dl[2]/dd[1]/div/ul[1]/li[2]/input').click()


# In[53]:


driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input').click()


# In[54]:


driver.find_element_by_xpath('//*[@id="divGroup"]/dl[2]/dd[1]/div/ul[1]/li[1]/input').click()


# In[55]:


driver.find_element_by_xpath('//*[@id="divGroup"]/div/a[2]').click()


# In[ ]:


# qingchu= ("//*[@id="divGroup"]/div/a[2]")
# queding=("//*[@id="divGroup"]/div/a[1]")
# //*[@id="divGroup"]/dl[1]/dd[1]/div/ul[1]/li[1]/input
# //*[@id="selectCheckAll1"]
# //*[@id="btn-download-all"]


# In[56]:


driver.find_element_by_xpath('//*[@id="divGroup"]/dl[2]/dd[1]/div/ul[1]/li[2]/input').click()


# In[57]:


driver.find_element_by_xpath('//*[@id="divGroup"]/div/a[1]').click()


# In[58]:


driver.find_element_by_xpath('//*[@id="divGroup"]/dl[1]/dd[1]/div/ul[1]/li[1]/input').click()


# In[59]:


driver.find_element_by_xpath('//*[@id="selectCheckAll1"]').click()


# In[60]:


element=driver.find_element_by_xpath('//*[@id="batchOpsBox"]/li[1]/a')
element.click()


# In[ ]:





# In[ ]:


#  refworks 查看与导出


# In[61]:


## 切换窗口
driver.window_handles


# In[64]:


driver.switch_to_window(driver.window_handles[2])


# In[65]:


element=driver.find_element_by_xpath('//*[@id="btn-download-all"]')
element.click()


# In[66]:


driver.window_handles


# In[67]:


driver.switch_to_window(driver.window_handles[1])


# In[68]:


element=driver.find_element_by_xpath('//*[@id="gridTable"]/div[1]/div[2]/div[1]/a')
element.click()


# In[69]:


for i in range(0,4):
    driver.find_element_by_xpath('//*[@id="selectCheckAll1"]').click()
    driver.find_element_by_id('PageNext').click()
    time.sleep(5)
    display(i)


# In[70]:


from selenium.webdriver.common.action_chains import ActionChains
move = driver.find_element_by_xpath('//*[@id="batchOpsBox"]/li[2]/a')
#对定位到的元素执行悬停操作
ActionChains(driver).move_to_element(move).perform()


# In[71]:


move = driver.find_element_by_xpath('//*[@id="batchOpsBox"]/li[2]/ul/li[1]/a')
ActionChains(driver).move_to_element(move).perform()
driver.find_element_by_xpath('//*[@id="batchOpsBox"]/li[2]/ul/li[1]/ul/li[8]/a').click()


# In[73]:


driver.switch_to_window(driver.window_handles[3])


# In[ ]:


# //*[@id="litotxt"]
# CNKI-20210616012516614.txt


# In[74]:


# 导出 refworks
element=driver.find_element_by_xpath('//*[@id="litotxt"]')
element.click()


# In[75]:


# 查看txt
with open('CNKI-20210616012516614.txt', encoding='utf-8') as f:
    display(f.readlines())


# In[ ]:


### 翻页
for i in range(0,11):        
    if driver.find_element_by_id('changeVercode'):
        img_url=driver.find_element_by_id('changeVercode').get_attribute('src')
        vercode=identify(img_url)
        driver.find_element_by_id('Vercode').send_keys(vercode)
        driver.find_element_by_id('checkCodeBtn').click()
    else:
        driver.find_element_by_id('PageNext').click()
        time.sleep(5) 
## 报错分析：1. Alert Text: 不能超过500个,若要重新选择,请按清除按钮,再进行选取操作，知网只能勾选500个选项，在中国知网检索，一次导出参考文献不能超过500条，分析不能超过200条。对于保存参考文献每次都累加，总数不能超过1500条。进行如下操作，在检索结果列表中勾选参考文献，页面右下角出现一个对话框，如图1，点击“查看已选文献”，跳转到“文献管理中心”页面，如图2，勾选文献，做“全部清除”处理，
## 2. 遇到验证码问题，通过使用baidu api ocr 识别，
## 3. 延长睡眠时间，保证网络通畅


# In[ ]:


# ocr 调用api


# In[76]:


## 百度api
import requests 
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=ae0r9UouUsjKFGbscXkSlkQY&client_secret=HoLVjtAUCREDrj3mtAflyZxZmN4Ptl4y'
response = requests.get(host)
if response:
    a=response.json()
    print(a)


# In[77]:


access_token=a['access_token']
access_token


# In[78]:


import requests
import base64
def identify(img_url):
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage"
    url = img_url
    obtain=requests.get(url)
    transform=obtain.content
    img=base64.b64encode(transform)
    params = {"image":img}
    access_token = '[调用鉴权接口获取的token]'
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    json=response.json()
    return(json['xxx']) 


# In[ ]:




